package com.jdk._02_方法引用;


import java.util.function.Consumer;

/**
 * 方法引用
 * 是lambda表达式的进一步简写，存在三种形式
 * 1.类名::静态方法 ，满足 lambda表达式右侧只有一行，参数与返回值可以对应。
 * 2.实例名::方法，满足 lambda表达式右侧只有一行，参数与返回值可以对应。
 * 3.类名::实例方法，满足 lambda表达式右侧只有一行，参数与返回值可以对应。且 只有两个参数，并且参数1作为调用者，参数2作为参数，且顺序不能改变
 */
public class _Test {

    public static void main(String[] args) {

        //
        //1.类名::静态方法 ，满足 lambda表达式右侧只有一行，参数与返回值可以对应。
        Consumer<Object> c1 = (a) -> {
            Method.test2(a);
        };
        //1.简写
        Consumer<Object> c1_ = Method::test2;


        //
        //2.实例名::方法，满足 lambda表达式右侧只有一行，参数与返回值可以对应。
        Method method = new Method();
        Consumer<Object> c2 = (a) -> {
            method.test1(a);
        };
        //2.简写
        Consumer<Object> c2_ = method::test1;


        //
        //3.类名::实例方法，满足 lambda表达式右侧只有一行，参数与返回值可以对应。且只有两个参数，并且参数1作为调用者，参数2作为参数，且顺序不能改变
        Face03<Method, String> face03 = (t, r) -> {
            t.test1(r);
        };
        //3.简写
        Face03<Method, String> face03_ = Method::test1;

    }

    /**
     * 自定义函数式接口
     *
     * @param <T>
     * @param <R>
     */
    @FunctionalInterface
    interface Face03<T, R> {
        void test1(T t, R r);
    }

    /**
     * 定义测试类
     */
    static class Method {


        public void test1(Object a) {
        }

        public static void test2(Object a) {
        }

    }

}
